/*
 * BallStrategy.h
 *
 *  Created on: Jun 24, 2012
 *      Author: mivia
 */

#ifndef BALLSTRATEGY_H_
#define BALLSTRATEGY_H_

#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>

#include "../Utils.h"
#include "ObjectType.h"
#include "POI.h"

namespace objpreproc {

/**
 * \class BallStrategy
 * @brief
 * @details
 * @date May 25, 2012
 * @author Gennaro Capo
 * @author Mirko Conte
 * @author Vincenzo De Notaris
 * @author Roberto Pacilio
 * @version 1.0
 * @namespace objpreproc
 */
class BallStrategy {

public:

	/**
	 * Costruttore della classe BallStrategy.
	 */
	BallStrategy();

	/**
	 * Distruttore della classe BallStrategy.
	 */
	~BallStrategy();

	/**
	 * Metodo che restituisce in output la tipologia di strategia associata all'oggetto corrente.
	 * @return tipologia di strategia.
	 */
	inline static const ObjectType getType() {
		return _TYPE;
	}

	/**
	 * Metodo che, data un immagine di input, effettua l'operazione di sogliatura per individuare una palla nella scena.
	 * @param src immagine di input.
	 * @param dest immagine di destinazione.
	 */
	void doThreshold(const cv::Mat &src, cv::Mat &dest);

	/**
	 * Metodo che, data un immagine di input, applica l'operatore morfologico di erosione.
	 * @param src immagine di input.
	 * @param dest immagine di destinazione.
	 */
	void doErosion(const cv::Mat &src, cv::Mat &dest);

	/**
	 * Metodo che, data un immagine di input, applica l'operatore morfologico di dilatazione.
	 * @param src immagine di input.
	 * @param dest immagine di destinazione.
	 */
	void doDilatation(const cv::Mat &src, cv::Mat &dest);

	/**
	 * Metodo che, data un immagine di input, individua il blob associata alla palla se essa è presente nella scena.
	 * @param mask maschera associata alla palla da cui estrarre blob.
	 * @param keypoints vettore di KeyPoint, ognuno dei quali rappresenta il centro di un blob individuato.
	 */
	void doBlobDetection(const cv::Mat &image, std::vector<cv::KeyPoint> &keypoints, const cv::Mat &mask = cv::Mat());

	void doPOIExtraction(const cv::Mat &depth, std::vector<cv::KeyPoint> &keypoints, std::vector<poi::POI*> &pois);

private:

	/*
	 * Previene dalla costruzione mediante copia.
	 */
	BallStrategy(const BallStrategy&);

	/*
	 * Previene l'assegnamento.
	 */
	BallStrategy& operator = (const BallStrategy&);

	static const ObjectType _TYPE = BALL;

	cv::Mat _erosion_kernel;
	cv::Mat _dilatation_kernel;

	cv::Mat* _up_thresh;
	cv::Mat* _low_thresh;

	cv::Scalar* _threshold_values_min_up;
	cv::Scalar* _threshold_values_max_up;

	cv::Scalar* _threshold_values_min_low;
	cv::Scalar* _threshold_values_max_low;

	cv::SimpleBlobDetector::Params* _detection_params;
	cv::SimpleBlobDetector* _simple_blob_detector;

};

} /* namespace objpreproc */

#endif /* BALLSTRATEGY_H_ */
